#ifndef _SPI_C_
#define _SPI_C_


#include "include/uart.h"
#include "include/spi.h"
#include <intrins.h>

/*
*********************************************************************************************************
*	函 数 名: spi_Delay
*	功能说明: 时序延迟
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/
void spi_Delay(void)
{
//	unsigned char t;
//	for (t = 0; t <1; t++);       /* 1，大概203KHz ，示波器测试延时时间2.5us*/
  _nop_();												//延时时间约1us,周期为2us。
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	
}

/*
*********************************************************************************************************
*	函 数 名: spi_init
*	功能说明: SPI总线初始化
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/

void spi_init(void)
{
	P01F = OUTPUT; //设置 P10 为输出功能, 作为 SPI SCK
  P10F = 	INPUT; //设置 P01 为输入功能, 作为 SPI MISO
  P00F = OUTPUT; //设置 P00 为输出功能, 作为 SPI MOSI
  P03F = OUTPUT; //设置 P15 为输出功能，作为 SPI 片选引脚
  P03 = 1; //设置片选引脚为高
//	P00 = 1;
}

void spi_sendbyte(unsigned char val)
{
	unsigned char i = 0;
	for(i=0;i<8;i++)
	{
		SPI_SCK = 0;
		spi_Delay();
		
		if((val&0x80)>>7)
			SPI_MOSI = 1;
		else
			SPI_MOSI = 0;
		val <<= 1;
		
		SPI_SCK =1;
		spi_Delay();
	}
	SPI_SCK = 0;
}

unsigned char spi_recbyte(void)
{
	unsigned char data receive_data = 0x00;
	unsigned char i = 0;
	for(i=0;i<8;i++)
	{
		SPI_SCK = 0;
		spi_Delay();
		
		if(SPI_MISO != 0)
			receive_data |= (0x80>>i);
		
		SPI_SCK = 1;
		spi_Delay();
	}
	SPI_SCK = 0;
	return receive_data;
}

/*
*********************************************************************************************************
*	函 数 名: spi_swapbyte
*	功能说明: 交换数据 CPHA = CPOL = 0 大端模式 高位先行
*	形    参：val:写入值
*	返 回 值: 读取数据
*********************************************************************************************************
*/
unsigned char spi_swapbyte(unsigned char val)
{
	unsigned char data receive_data = 0x00;
	unsigned char i = 0;
//	SPI_CS = 0;
	for(i=0;i<8;i++)
	{
		SPI_SCK = 0;
		spi_Delay();
		if(val&0x80)
			SPI_MOSI = 1;
		else
			SPI_MOSI = 0;
		val <<= 1;
		
		if(SPI_MISO != 0)
			receive_data |= (0x80>>i);
		SPI_SCK =1;
		spi_Delay();
	}
	SPI_SCK = 0;
//	SPI_CS =1;
	return receive_data;
}

/*
*********************************************************************************************************
*	函 数 名: spi_write_reg
*	功能说明: 写寄存器
*	形    参：add:寄存器地址；
*			  val:写入值
*	返 回 值: 无
*********************************************************************************************************
*/
void spi_write_reg(unsigned char addr, unsigned char val)
{
	SPI_CS = 0;
	spi_swapbyte((addr<<1)&0x7e);		//写寄存器地址
	spi_Delay();
	spi_swapbyte(val);					//写数据
	SPI_CS = 1;
}

/*
*********************************************************************************************************
*	函 数 名: spi_read_reg
*	功能说明: 读寄存器
*	形    参：add:寄存器地址；
*	返 回 值: 读取的寄存器值
*********************************************************************************************************
*/
unsigned char spi_read_reg(unsigned char addr)
{
	unsigned char data rec_data =0;
	SPI_CS = 0;
	spi_swapbyte((addr<<1)|0x80);		//读
//	spi_Delay();
	rec_data = spi_swapbyte(0xff);					//读数据
	SPI_CS = 1;
	return rec_data;
}

/*
*********************************************************************************************************
*	函 数 名: spi_write_fifo
*	功能说明: 连续写FIFO
*	形    参：len:写入长度
*             val：写入的数据
*	返 回 值: 无
*********************************************************************************************************
*/
void spi_write_fifo(unsigned char*val,unsigned char len)
{
	unsigned char i = 0;
	SPI_CS = 0;
	spi_swapbyte(wfifoaddr);	//寄存器地址写模式
	for(i = 0; i < len;i++)
	{
		spi_sendbyte(*val++);   //连续写入fifo			
	}
	SPI_CS = 1;
}

/*
*********************************************************************************************************
*	函 数 名: spi_read_fifo
*	功能说明: 连续读多字节FIFO内容
*	形    参：len: 读取的长度
*             val：读取的数据
*	返 回 值: 无
*********************************************************************************************************
*/
void spi_read_fifo(unsigned char *val,unsigned char len)
{
	unsigned char fifolen,i;
  fifolen = len;
		
	
	for(i = 0; i < len;i++)
	{
		SPI_CS = 0;
		spi_swapbyte(rfifoaddr);	//寄存器地址读模式
		val[i] = spi_recbyte();   //连续读取fifo		
		SPI_CS = 1;		
	}
	
}

#endif
